using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 被动技能稀有度枚举
/// </summary>
public enum SkillRarity
{
    Weak,    // 弱点
    Common,  // 普通
    Rare,    // 稀有
    Epic, // 史诗
}

public enum SkillType
{
    [InspectorName("战斗")]
    Fighting,
[InspectorName("生活")]
    Life
}

public enum Classification
{
    
}

/// <summary>
/// 条件类型枚举
/// </summary>
public enum ComparisonType
{
    [InspectorName(">")]
    GreaterThan,            // 大于

    [InspectorName(">=")]
    GreaterThanOrEqual,     // 大于等于

    [InspectorName("=")]
    Equal,                  // 等于

    [InspectorName("<=")]
    LessThanOrEqual,        // 小于等于

    [InspectorName("<")]
    LessThan                // 小于
}

/// <summary>
/// 使用条件定义
/// </summary>
public class UsageCondition
{
    /// <summary>
    /// 状态 ID
    /// </summary>
    public int StateId;             // 状态id

    /// <summary>
    /// 比较条件
    /// </summary>
    public ComparisonType Condition; // 判断条件

    /// <summary>
    /// 比较值
    /// </summary>
    public int Value;               // 值
}

/// <summary>
/// 被动技能触发条件枚举
/// </summary>
public enum PassiveTrigger
{
    [InspectorName("无触发条件")]
    None,                   // 无触发条件

    [InspectorName("被贿赂时触发")]
    OnBribery,              // 被贿赂时触发

    [InspectorName("每日触发")]
    OnDaily,                // 每日触发

    [InspectorName("每小时触发")]
    OnHourly,               // 每小时触发

    [InspectorName("直接触发")]
    OnDirect,               // 直接触发

    [InspectorName("社交时触发")]
    OnSocial,               // 社交时触发

    [InspectorName("拥有物品时")]
    OnHaveItem,             // 拥有物品时

    [InspectorName("移出物品时")]
    OnItemRemoved,          // 移出物品时

    [InspectorName("替换物品时")]
    OnItemReplaced,         // 替换物品时

    [InspectorName("装备物品时")]
    OnItemEquipped,         // 装备物品时

    [InspectorName("物品数量大于时")]
    OnItemCountGreaterThan, // 物品数量大于时

    [InspectorName("物品数量大于等于时")]
    OnItemCountGreaterOrEqual, // 物品数量大于等于时

    [InspectorName("物品数量等于时")]
    OnItemCountEqual,       // 物品数量等于时

    [InspectorName("物品数量小于等于时")]
    OnItemCountLessOrEqual, // 物品数量小于等于时

    [InspectorName("物品数量小于时")]
    OnItemCountLessThan,    // 物品数量小于时

    [InspectorName("物品品质大于时")]
    OnItemQualityGreaterThan, // 物品品质大于时

    [InspectorName("物品品质大于等于时")]
    OnItemQualityGreaterOrEqual, // 物品品质大于等于时

    [InspectorName("物品品质等于时")]
    OnItemQualityEqual,     // 物品品质等于时

    [InspectorName("物品品质小于等于时")]
    OnItemQualityLessOrEqual, // 物品品质小于等于时

    [InspectorName("物品品质小于时")]
    OnItemQualityLessThan,  // 物品品质小于时

    [InspectorName("物品获取时")]
    OnItemAcquired,         // 物品获取时

    [InspectorName("到达地区时")]
    OnRegionReached,        // 到达地区时

    [InspectorName("不在地区时")]
    OnRegionNotIn,          // 不在地区时

    [InspectorName("离开地区时")]
    OnRegionLeft,           // 离开地区时

    [InspectorName("变量大于时")]
    OnVariableGreaterThan,      // 变量大于时

    [InspectorName("变量大于等于时")]
    OnVariableGreaterOrEqual,   // 变量大于等于时

    [InspectorName("变量等于时")]
    OnVariableEqual,            // 变量等于时

    [InspectorName("变量小于等于时")]
    OnVariableLessOrEqual,      // 变量小于等于时

    [InspectorName("变量小于时")]
    OnVariableLessThan,         // 变量小于时

    [InspectorName("变量百分百大于时")]
    OnVariablePercentGreaterThan, // 变量百分百大于时

    [InspectorName("变量百分百大于等于时")]
    OnVariablePercentGreaterOrEqual, // 变量百分百大于等于时

    [InspectorName("变量百分百等于时")]
    OnVariablePercentEqual,         // 变量百分百等于时

    [InspectorName("变量百分百小于等于时")]
    OnVariablePercentLessOrEqual,   // 变量百分百小于等于时

    [InspectorName("变量百分百小于时")]
    OnVariablePercentLessThan,      // 变量百分百小于时

    [InspectorName("战斗时触发")]
    OnCombat,                     // 战斗时触发

    [InspectorName("触发事件时")]
    OnEventTriggered,              // 触发事件时
    
    [InspectorName("攻击造成伤害时")]
    OnAttackDamage                 //攻击造成伤害时
}

/// <summary>
/// 扩展方法，用于为 SkillRarity 和 PassiveTrigger 添加中文映射
/// </summary>
public static class EnumExtensions
{
    /// <summary>
    /// 获取 SkillRarity 对应的中文描述
    /// </summary>
    public static string ToChinese(this SkillRarity rarity)
    {
        switch (rarity)
        {
            case SkillRarity.Common:
                return "普通";
            case SkillRarity.Rare:
                return "稀有";
                case SkillRarity.Weak:
                return "弱点";
            case SkillRarity.Epic:
                return "史诗";
            default:
                return "";
        }
    }

}

/// <summary>
/// 属性修正类，用于描述单个属性的增减效果
/// </summary>
[Serializable]
public class AttributeModifier
{
    public string attributeName; // 要修改的属性名称，如 "意志"、"经营收入"、"感知" 等
    public string modifierValueString;  // 修改数值，正数表示增加，负数表示减少
    public bool isPercentage;    // 是否以百分比方式修改（true：百分比，false：直接数值）
}
[System.Serializable]
public enum PassiveType// Trigger condition record type
{
    [InspectorName("事件")]
    Event,
    [InspectorName("角色")]
    Character
    
}

/// <summary>
/// 技能效果类，用于描述在特定触发条件下需要应用的一系列属性修正
/// </summary>
[Serializable]
public class PassiveEffect
{
    public PassiveTrigger trigger;              // 效果触发条件（例如：OnBribery）
    public PassiveType PassiveType;
    public string triggerSubject; // 主要用于记录这个触发条件的附加条件，比如变量 > 1 时是谁的变量 
    public string triggerValue; // 主要用于记录这个触发条件的附加条件，比如变量 > 1 时的值
    public List<AttributeModifier> modifiers;     // 此效果下包含的所有属性修正

    // 构造函数，初始化列表，防止空引用
    public PassiveEffect()
    {
        modifiers = new List<AttributeModifier>();
    }
}

/// <summary>
/// 被动技能数据类，用于存储一个技能的基本信息和多个效果
/// </summary>
[Serializable]
public class PassiveSkillData
{
    public string skillName;             // 技能名称
    public string skillDescribe;        //技能描述
    public SkillType type;              //技能类型
    public ItemData.Target target;      //技能选择目标
    public int num;                     //技能作用目标数量
    public DamageType damageType;       //技能伤害类型
    public SkillRarity rarity;           // 技能稀有度
    public List<PassiveEffect> effects;  // 包含的所有效果
    public string skillIconImagePath;    // 技能图标图片路径
    public ImageSliceInfo skillIconSliceInfo; // 技能图标切图信息
    public List<UsageCondition> UsageConditions; // 使用条件
    public float targetRange;      // 敌方目标攻击范围
    public bool isBlockable;       // 是否可格挡
    public float baseDamage;       // 基础值
    public float baseDamageReduction; //基础值修正
    public float baseHitRate;      // 基础命中
    public int apCost;     // AP 消耗
    public string description; //技能描述
    public float baseMissChance;  // 基础失误概率
    // 构造函数，初始化列表
    public PassiveSkillData()
    {
        effects = new List<PassiveEffect>();
    }
}
